contour plot with python
gluplotで contourplot するように作ったファイルを使って contourplot することを目標にする。preparation
plot(2d) をみよ。データの読み込み
前半は plot(2d)と同じ。
plotdir = ""
file_id='M1_1000_tanB30_quarkEDM.dat'
rfile = plotdir + file_id
data = np.loadtxt(rfile, comments='#')
X = data[:,4] # 5列目のデータを取得。:は全範囲の意味。配列の番号は 0 から始まることに注意。
Y = data[:,5]
Z = data[:,6]
次に、contour plot をするために2次元配列を作らないといけない。ここで
X=[-180,-180,...,-180,-170,...,-170,-160,.......,...., 180]
Y=[-10, -9, -8, ..., 9, 10,-10,-9,...]
となっているとする。 これを次のようにすれば2次元配列ができる。(もっとスマートな方法があったが忘れた。)
aaaa=np.where(X==-180.) # X で -180 が入っている場所を全て特定する。
start=aaaa[0][0] # -180 の最初の番地
goal=aaaa[0][-1] # -180 の最後の番地
minX = X[start] # X の最初の数。この例だと -180.
maxX = X[-1] # X の最後の数。この例だと +180.
diffX = X[goal+1]-X[start] # ひとブロックで数字がいくつ変わるか。今の場合 -170 と -180 の差なので +10。
xnew=np.reshape(X, ((maxX-minX)/diffX + 1, goal+1)) #[[-180,...,-180],[-170,...,-170],...]
ynew=np.reshape(Y, ((maxX-minX)/diffX + 1, goal+1)) #[[-10,-9...,9,10],[-10,-9...,9,10],...]
znew=np.reshape(Z, ((maxX-minX)/diffX + 1, goal+1)) #[[...],...,[...]]
これでデータの準備完了。足したり引いたりもできる。Z+3 とか。Z + X とか。
contourplot
# contourplot で lavel を 1.2e-3 ではなく 1.2\times 10^{-3} にするのに必要な関数.
f = ticker.ScalarFormatter(useOffset=False, useMathText=True)
g = lambda x,pos : "${}$".format(f._formatSciNotation('%1.10e' % x))
# 軸の名前など
plt.figure(figsize=(8,5))
plt.gca().set_aspect('equal')
plt.title( r"$d_n$ [e cm] (positive $GG\tilde{G}$)", fontsize=14)
plt.ylabel(r'Arg($M_1$)')
plt.xlabel(r'Arg($\mu$)')
plt.xticks([-180,-90,0,90,180])
plt.yticks([-180,-90,0,90,180])
plt.axes().xaxis.set_minor_locator(MultipleLocator(10))
plt.axes().yaxis.set_minor_locator(MultipleLocator(10))
# 等高線を描く
CR=plt.contour(xnew,ynew,znew,colors='black',levels=[-10**(-27.),-1.6*10**(-27.),-5*10**(-28.),10**(-27.),1.6*10**(-27.),5*10**(-28.)])
# 等高線の値をどう表示するか指定
plt.clabel(CR, fontsize=11, fmt=ticker.FuncFormatter(g))
# 塗りつぶし
plt.contourf(xnew,ynew,znew,levels=[-2.6*10**(-26.),-1])
plt.contourf(xnew,ynew,znew,levels=[2.6*10**(-26.),1])
# 出力
plt.savefig('hoge.pdf', bbox_inches="tight")
# もっと余白を小さくするなら以下。ただし、軸が見切れるときがある。
# plt.savefig('hoge.pdf', bbox_inches="tight", pad_inches=0.0)
plt.close()
ここで contour
は等高線、contourf
はぬりつぶし。
重ねたい場合は何行も書く。
contour の option について
-
colors='black'
にすると、負の数が自動的に点線になる。省略するとカラフルになるが、個人的には見づらい。 -
levels
は省略可能。
plt.clabel について
- contour の上に数字を書くコマンド。上の例では $-5\times10^{-28}$ のように表示される。
- ほかには
fmf='%1.1e'
とかfmf='%1.2f'
とか。